home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d2 / nansi286.arc / SETRAW.MSC < prev   
Text File  |  1987-07-19  |  2KB  |  58 lines

  1. /*--- setraw.msc -------------------------------------------------
  2.   Routines to set and reset raw mode on stdin/stdout.
  3.   For Microsoft C.
  4. ------------------------------------------------------------------*/
  5. #include <dos.h>
  6. /* Use the IOCTL DOS function call to change stdin and stdout to raw mode.
  7.  * For stdin, this prevents MSDOS from trapping ^P, ^S, ^C, thus freeing us
  8.  * of ^P toggling 'echo to printer'.
  9.  * For stdout, this radically speeds up the output because there is no
  10.  * checking for these special characters in the input buffer whenever
  11.  * screen output is occurring.
  12.  * Note that only the stdin OR stdout ioctl need be changed since
  13.  * apparently they are handled as the same device.
  14.  * Thanks to Mark Zbikowski (markz@microsoft.UUCP) for helping me with
  15.  * this.
  16.  * --- This stolen from sources to the mighty game HACK ---
  17.  */
  18. #define DEVICE        0x80
  19. #define RAW        0x20
  20. #define IOCTL        0x44
  21. #define STDIN        fileno(stdin)
  22. #define STDOUT        fileno(stdout)
  23. #define GETBITS        0
  24. #define SETBITS        1
  25. static unsigned    old_stdin, old_stdout, ioctl();
  26. /*--- set_raw() ----------
  27.   Call this to set raw mode; call restore_raw() later to restore
  28.   console to old rawness state.
  29. --------------------------*/
  30. set_raw()
  31. {
  32.     old_stdin = ioctl(STDIN, GETBITS, 0);
  33.     old_stdout = ioctl(STDOUT, GETBITS, 0);
  34.     if (old_stdin & DEVICE)
  35.         ioctl(STDIN, SETBITS, old_stdin | RAW);
  36.     if (old_stdout & DEVICE)
  37.         ioctl(STDOUT, SETBITS, old_stdout | RAW);
  38. }
  39. restore_raw()
  40. {
  41.     if (old_stdin)
  42.         (void) ioctl(STDIN, SETBITS, old_stdin);
  43.     if (old_stdout)
  44.         (void) ioctl(STDOUT, SETBITS, old_stdout);
  45. }
  46. static unsigned
  47. ioctl(handle, mode, setvalue)
  48. unsigned setvalue;
  49. {
  50.     union REGS regs;
  51.  
  52.     regs.h.ah = IOCTL;
  53.     regs.h.al = mode;
  54.     regs.x.bx = handle;
  55.     regs.h.dl = setvalue;
  56.     regs.h.dh = 0;            /* Zero out dh */
  57.     intdos(®s, ®s);
  58.     return